<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    

    <script>

        // this 指向
        // a. 一般来说    没有声明this的指向 默认指向window 普通函数  => window
        // b. this 谁调用就直接指向谁   btn.onclick  this=> btn   lucy.say =  lucy
        // c. 箭头函数 没有this  依赖借用上一级(父级)的this  
        // d. 构造函数的this 指向 实例化对象本身  
        // e. call apply bind  可以改变this 指向  


        // 所有的函数都可以访问   call apply bind    改变this指向 

        // call(obj,arg1,arg2,arg3)    this=>obj 
        // 1.调用函数
        // 2.函数执行的时候  强制把this 改变  指向函数的第一个参数
        // 3.如果有其他参数 按照顺序写  默认第二个参数开始 

        // function fn(a,b){
        //     console.log(this,a,b);
        // }

        // // 每一个函数定义  new Function(){}
        // console.dir(fn);
        // console.log(fn.constructor == Function )
        // console.log(fn.__proto__ == Function.prototype)
        // fn.call()   // this => window 

        // fn.call(document)
        // fn.call(true)
        // fn.call(null)    // this-> null ->   window 
        // fn.call(undefined)   // this-> undefined ->   window 
        // fn.call(100,200,400);


        // apply
        // apply(this,[arg1,arg2,arg3...]);
        // 1.调用函数
        // 2.函数执行的时候  强制把this 改变  指向函数的第一个参数
        // 3.如果有其他参数 按照顺序写 需要把参数放到 数组里去 

        // function fn(a,b){
        //     console.log(this,a,b);
        // } 

        // fn.apply();
        // fn.apply(document)
        // fn.apply(document,[1000,200])

        // bind   
        // bind(this,arg1,arg2,arg3,...)  
        // 1.在原函数的基础上新建一个新的函数  
        // 2.新函数执行的时候 强制把this指向 bind绑定的第一个参数  
        // 3.需要参数 提前定义 依次安装顺序书写   


        function fn(a,b){
            console.log(this,a,b);
        } 

        // var newFn = fn.bind(document,10,20);
        // // console.log(newFn, newFn === fn);

        // newFn();

        var newFn  = fn.bind(document);   //  默认有a , b 2个参数 

        newFn(100,200);
    </script>
</body>
</html>